原帖 | Jack | 2024-09-07 03:06 | 👍1 | 阅读约1
释放信号量任务调度过程(taskA:2ms、taskB:阻塞、idle task:1ms、坐标为时间片)
1.0 task A运行时释放信号量(xQueueGenericSend)
2.0 释放信号量时,会将task B的TCB放入到ReadyTasksLists,并比较task A和task B的优先级
2.1 如果task B的优先级比task A的优先级高+抢占式调度,或者信号量队列已满+等待时间到,则触发pendsv中断
2.2 pendsv中断中的vTaskSwitchContext会进行任务切换(时间片轮转的时序推演见 如果系统开始运行后,A任务运行了0.5S就DELAY阻塞),挂载将ReadyTasksLists中优先级最高的task
3.0 task B接收信号量进行逻辑处理
4.0 如果task B的运行时间大于 时间片 - task A之前占用的时间,则会触发systick中断。
4.1 systick中断进行任务调度,若需要调度,则触发pendsv中断
4.2 pendsv中断中的vTaskSwitchContext会进行任务切换,挂载将ReadyTasksLists中优先级最高的task
5.0 task B继续运行
6.0 task B重新运行到xQueueReceive
6.1 queue中没有数据,vTaskPlaceOnEventList会将当前任务放入DelayTasksLists链表
6.2 进行任务调度和触发pendsv中断。若没有高优先级任务,则切换到task A
7.0 task A继续运行
8.0 task A运行到vTaskDelay
8.1 xTaskDelay会将当前任务放入DelayTasksLists链表
8.2 进行任务调度和触发pendsv中断。若没有高优先级任务(task B阻塞状态),则切换到idle task
9.0 idle task运行
9.1 idle task运行到vTaskDelay
9.2 进行任务调度和触发pendsv中断。若没有高优先级任务(task B阻塞状态、task A delay时间未到),则继续运行idle task
......
10.0 idle task 运行时,触发systick中断,task A delay时间到,则切换到task A

相关笔记